package org.sction.util;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;

import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;

/**
 * @author 作者 : sorc
 * @version 创建时间：2012-8-14 下午4:16:36
 * 
 *          类说明
 */
public class ClassUtils {
	private static final Logger logger = Logger.getLogger(ClassUtils.class);

	/**
	 * 判断一个类是否为基本数据类型。
	 * 
	 * @param clazz
	 *            要判断的类。
	 * @return true 表示为基本数据类型。
	 */
	public static boolean isBaseDataType(Class<?> clazz) {
		return (clazz.equals(String.class) || clazz.equals(Integer.class)
				|| clazz.equals(Byte.class) || clazz.equals(Long.class)
				|| clazz.equals(Double.class) || clazz.equals(Float.class)
				|| clazz.equals(Character.class) || clazz.equals(Short.class)
				|| clazz.equals(BigDecimal.class)
				|| clazz.equals(BigInteger.class)
				|| clazz.equals(Boolean.class) || clazz.equals(Date.class)
				|| clazz.isPrimitive() || clazz.isArray());
	}

	public static Object invokeGet(Field field, Object entity) {
		if (entity == null || field == null) {
			logger.error("发现存在Null对象（" + entity + "）属性（" + field + "））");
			return null;
		}
		boolean isAccessible = field.isAccessible();
		try {
			if (!isAccessible) {
				field.setAccessible(true);
			}
			return field.get(entity);
		} catch (Exception e) {
			logger.error("读取对象（" + entity.getClass() + "）属性（" + field.getName()
					+ "）时发生错误!");
		} finally {
			if (!isAccessible) {
				field.setAccessible(false);
			}
		}
		return null;
	}

	public static void invokeInjection(Field field, Object entity, Object value) {
		if (entity == null || field == null) {
			logger.error("发现存在Null对象（" + entity + "）属性（" + field + "）注入值（"
					+ value + "）");
			return;
		}
		// boolean isAccessible = field.isAccessible();
		try {
			// if (!isAccessible) {
			field.setAccessible(true);
			// }
			field.set(entity, value);
			logger.debug("为对象（" + entity + "）属性（" + field + "）注入值（" + value
					+ "）");
		} catch (Exception e) {
			logger.error("执行对象（" + entity.getClass() + "）属性（" + field.getName()
					+ "）注入值（" + value + "）时发生错误!");
		} finally {
			// if (!isAccessible) {
			// //field.setAccessible(false);
			// }
		}
	}

	public static Field[] allFields(Class<?> clazz) {
		Field[] fields = clazz.getDeclaredFields();
		if (clazz.getGenericSuperclass() != null) {
			return (Field[]) ArrayUtils.addAll(fields,
					allFields(clazz.getSuperclass()));
		}
		return fields;
	}

}
